import axios from "axios";
import {ElLoading, ElMessage, ElMessageBox, ElNotification} from 'element-plus';
import {showMessage} from "@/common/errorCode.ts";
import useUser from "@/stores/user";

const getToken = () => {
    let token: string | null = localStorage.getItem("token")
    if (token) {
        return token;
    } else {
        return '';
    }
};

let loading: any;

//开始加载
const startLoading = () => {

    interface Options {
        lock: boolean,
        text: string,
        background: string
    }

    const options: Options = {
        lock: true,
        text: '加载中...',
        background: 'rgba(0, 0, 0, 0.6)'
    }
    loading = ElLoading.service(options);
}

//结束加载
const endLoading = () => {
    loading.close();
}

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'; // 配置请求头
// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项，表示请求URL公共部分
    baseURL: '/api',
    // 超时
    timeout: 10000
})

//请求拦截
service.interceptors.request.use(config => {
        //加载loading
        startLoading();
        // 是否需要设置 token
        const isToken = (config.headers || {}).isToken === false
        if (getToken() && !isToken) {
            config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
        }
        return config;
    }, error => {
        return Promise.reject(error);
    }
);

//响应拦截
service.interceptors.response.use(response => {
        const userStore = useUser();
        //结束loading
        endLoading();
        // 未设置状态码则默认成功状态
        const code = response.data.code || 200;
        // 获取错误信息
        const message = showMessage(code) || response.data.message || showMessage("default")
        if (code === 401) {
            ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                    confirmButtonText: '重新登录',
                    cancelButtonText: '取消',
                    type: 'warning'
                }
            ).then(() => {
                //调用退出登录接口
                userStore.Logout().then(() => {
                    location.href = '/';
                })
            }).catch(() => {

            });
            return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
        } else if (code === 500) {
            ElMessage({
                message: message,
                type: 'error',
                duration: 5000
            })
            return Promise.reject(new Error(message))
        } else if (code !== 200) {
            ElNotification({
                title: message,
                type: 'error'
            })
            return Promise.reject('error')
        } else {
            return response.data
        }
    }, error => {
        console.log("err", error)
        //结束loading
        endLoading();
        let {message} = error;
        if (message == "Network Error") {
            message = "后端接口连接异常";
        } else if (message.includes("timeout")) {
            message = "系统接口请求超时";
        } else if (message.includes("Request failed with status code")) {
            message = "系统接口" + message.substr(message.length - 3) + "异常";
        }
        ElMessage({
            message: message,
            type: 'error',
            duration: 5000
        })
        return Promise.reject(error)
    }
)

export default service;